home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / fwd-1.0.zip / process.cmd.for use with charsetw < prev    next >
Text File  |  2000-10-29  |  12KB  |  388 lines

  1. /* this cmd is called from forward.cmd . Do not use it alone. */
  2.  
  3. critsize=307200 /* If message size>critsize then executing smtp logoff before receiving it*/
  4. smtpsock=-1
  5.  
  6.  server=arg(1)
  7.  user=arg(2)
  8.  password=arg(3)
  9.  forward=arg(4)
  10.  keep=arg(5)
  11.  cenum=arg(6)
  12.  smtpserver=arg(7)
  13.  logfile=arg(8)
  14.  tempfdir=arg(9)
  15.  
  16. call saynlog 'Forwarding from 'server' for 'user' to 'forward
  17.  
  18. /*------------------------------------------------------------------
  19.  * get address of servers
  20.  *------------------------------------------------------------------*/
  21. rc = SockGetHostByName(server,"host.!")
  22. if (rc = 0) then
  23.    do
  24.     call saynlog "Unable to resolve pop3server name" errno
  25.     return -1
  26.    end
  27. server = host.!addr
  28. /*------------------------------------------------------------------
  29.  * open socket
  30.  *------------------------------------------------------------------*/
  31. sock = SockSocket("AF_INET","SOCK_STREAM","IPPROTO_TCP")
  32. if (sock = -1) then
  33.    do
  34.     call saynlog "Error opening socket:" errno
  35.     return -1
  36.    end
  37. /*------------------------------------------------------------------
  38.  * connect socket
  39.  *------------------------------------------------------------------*/
  40. server.!family = "AF_INET"
  41. server.!port   = 110
  42. server.!addr   = server
  43. rc = SockConnect(sock,"server.!")
  44. if (rc = -1) then
  45.    do
  46.      call saynlog "Error connecting to popserver :" errno
  47.      rc=SockSoclose(sock)
  48.      return -1
  49.    end
  50.  
  51.    call saynlog 'Connected to 'server
  52.    trc = GetResponse(sock)
  53.  
  54.    trc = SendMessage(sock,'USER 'user)
  55.    trc = GetResponseLine(sock)
  56.    parse var trc status rest
  57.    if status <> '+OK' then
  58.      do
  59.        qrc = SendMessage(sock,'QUIT')
  60.        call saynlog ' Error: User' user 'unknown on' server '.'
  61.        rc=SockSoclose(sock)
  62.        return -1
  63.      end
  64.  
  65.    trc = SendMessage(sock,'PASS 'password)
  66.    trc = GetResponseLine(sock)
  67.    parse var trc status rest
  68.    if status <> '+OK' then
  69.      do
  70.        qrc = SendMessage(sock,'QUIT')
  71.        call saynlog ' Error: Password wrong for' user ' on 'server'.'
  72.        rc=SockSoclose(sock)
  73.        return -1
  74.      end
  75.    else
  76.      do 
  77.        call saynlog 'Authentication completed successfully. Sending List command'
  78.        trc = SendMessage(sock,'LIST')
  79.        trc = GetResponse(sock)
  80.        messages = 0
  81.        parse var line.1 status rest
  82.        if status = '+OK' then 
  83.          do 
  84.            msginfo = GetResponseLine(sock)
  85.            do while msginfo <> '.'
  86.              messages = messages + 1
  87.              msginfo = GetResponseLine(sock)
  88.            end
  89.          end /* do */
  90.        if messages = 0 
  91.          then 
  92.           do
  93.            call saynlog ' There are no messages waiting for you.'
  94.           end
  95.          else
  96.            do 
  97.              call saynlog ' There are' messages 'messages waiting for you.'
  98.  
  99.              trc = SendMessage(sock,'LIST')
  100.              trc = GetResponse(sock)
  101.              do 
  102.                msginfo = GetResponseLine(sock)
  103.                messize.0=messages
  104.                do while msginfo <> '.'
  105.                  parse var msginfo number size
  106.                  messize.number=size
  107.                  call saynlog ' Message' number 'has' size 'bytes.'
  108.                  msginfo = GetResponseLine(sock)
  109.                end
  110.              end /* do */
  111.  
  112.              if messize.1<=critsize then smtpsock=ConnectSmtp(smtpserver)
  113.  
  114.              /* Get Mails */
  115.              do i = 1 to messages
  116.                if messize.i>critsize then smtpsock=closesmtp(smtpsock)
  117.                say ' Getting Message' i
  118.                trc = SendMessage(sock,'RETR 'i)
  119.                trc = GetResponse(sock)
  120.                parse var line.1 status rest
  121.                oneline = GetResponseLine(sock)
  122.                tempfname=SysTempFileName(tempfdir'temp????.msg')
  123.                rc=stream(tempfname,'c','open write')
  124.                linenum=0
  125.                fromaddr=''
  126.                do while oneline <> '.'
  127.                  rc=lineout(tempfname,oneline)
  128.                  linenum=linenum+1
  129.                  message.linenum=oneline
  130.                  res=translate(substr(oneline,1,4))
  131.                  if res='FROM' then 
  132.                   do
  133.                    beg=pos('<',oneline)
  134.                    if beg>0 then
  135.                     do 
  136.                      length=pos('>',oneline)-pos('<',oneline)+1
  137.                      fromaddr=substr(oneline,beg,length)                 
  138.                     end
  139.                              else
  140.                     do
  141.                      parse var oneline from addr rest
  142.                      if space(addr)<>'' then fromaddr=space(addr)
  143.                     end
  144.                    call saynlog 'Message from: 'fromaddr
  145.                   end
  146.                  oneline = GetResponseLine(sock)
  147.                end
  148.                rc=stream(tempfname,'c','close')                 
  149.                if fromaddr='' then
  150.                 do
  151.                  call saynlog 'From adress not found. Substituting with nobody@mail.ru'
  152.                  fromaddr='nobody@mail.ru'
  153.                 end 
  154.                chstmes='Charsetw.cmd: start at 'time('L')
  155.                say 'Thread 'cenum':'chstmes
  156.                call ipccontextcreate contextchst.cenum
  157.                call proccreatethread contextchst.cenum,'charsetw.cmd', tempfname
  158.                call ipccontextwait contextchst.cenum
  159.                call saynlog chstmes||' finished at 'time('L') 
  160.                rc=stream(tempfname,'c','open read')
  161.                linenum=0
  162.                do while lines(tempfname)=1
  163.                 linenum=linenum+1
  164.                 message.linenum=linein(tempfname)
  165.                end
  166.                rc=stream(tempfname,'c','close')                 
  167.  
  168.                if smtpsock<0 then smtpsock=ConnectSmtp(smtpserver)
  169.                trc25 = SendMessage(smtpsock,'HELO')
  170.                trc25 = GetResponseLine(smtpsock)
  171.                trc25 = SendMessage(smtpsock,'Mail from: 'fromaddr)
  172.                trc25 = GetResponseLine(smtpsock)
  173.                trc25 = SendMessage(smtpsock,'Rcpt to: 'forward)
  174.                trc25 = GetResponseLine(smtpsock)
  175.                trc25 = SendMessage(smtpsock,'Data')
  176.                trc25 = GetResponseLine(smtpsock)
  177.                do ind=1 to linenum
  178.                 trc25 = SendMessage(smtpsock,message.ind)              
  179.                end
  180.                trc25 = SendMessage(smtpsock,'.')
  181.                trc25 = GetResponseLine(smtpsock)
  182.                call saynlog 'Sendmail said: 'trc25
  183.                mesnum=left(trc25,3)
  184.                if mesnum=250 then '@del' tempfname
  185.  
  186.                if keep="" then
  187.                 do
  188.                  trc = SendMessage(sock,'DELE 'i)
  189.                  trc = GetResponse(sock)
  190.                  call saynlog ' Got, forwarded and deleted Message' i
  191.                 end
  192.                           else
  193.                 do
  194.                  call saynlog ' Got, forwarded and kept Message' i
  195.                 end 
  196.              end  
  197.            end
  198.      end
  199.  
  200. if smtpsock>0 then  smtpsock=closesmtp(smtpsock)
  201. trc = SendMessage(sock,'QUIT')
  202. trc = GetResponse(sock)
  203. rc=SockSoclose(sock)
  204.  
  205. exit
  206.  
  207. /*--------------------End of processing current pop3account-----------*/ 
  208.  
  209. /*-------------Connecting to SmtpServer procedure----------------------------*/
  210. ConnectSmtp: procedure expose logfile cenum
  211.  
  212. smtpserver=arg(1)
  213.  
  214. call saynlog 'Connecting to smtp server 'smtpserver
  215.  
  216. rc = SockGetHostByName(smtpserver,"host.!")
  217. if (rc = 0) then
  218.    do
  219.     call saynlog "Unable to resolve smtpserver name" smtpserver 
  220.     rc=stream(logfile,'c','close')
  221.     return -1
  222.    end
  223. smtpserver = host.!addr
  224. smtpsock = SockSocket("AF_INET","SOCK_STREAM","IPPROTO_TCP")
  225. if (smtpsock = -1) then
  226.  do
  227.   call Saynlog "Error opening socket :" errno
  228.   rc=stream(logfile,'c','close')
  229.   return -1
  230.  end
  231. smtpserver.!family = "AF_INET"
  232. smtpserver.!port   = 25
  233. smtpserver.!addr   = smtpserver
  234. rc = SockConnect(smtpsock,"smtpserver.!")
  235. if (rc = -1) then
  236.  do
  237.   call saynlog "Error connecting to smtpserver :" errno
  238.   rc=stream(logfile,'c','close')
  239.   return -1
  240.  end
  241. trc25 = GetResponseLine(smtpsock)
  242. trc25 = GetResponseLine(smtpsock)
  243. call saynlog 'We are connected to smtp server'
  244.  
  245. return smtpsock
  246.  
  247. /*------------------------------------------------------------------
  248.  * get a response from the server
  249.  *------------------------------------------------------------------*/
  250. GetResponse:     procedure expose !. line. logfile cenum smtpsock
  251.    sock = arg(1)
  252.  
  253.    moreids = "100 215 220 221 222 223 230 231"
  254.  
  255.    line.0 = 1
  256.    line.1 = GetResponseLine(sock)
  257.  
  258.    parse var line.1 rid .
  259.  
  260.    if (wordpos(rid,moreids) = 0) then
  261.       return ""
  262.  
  263.    say ' getting further lines '
  264.  
  265.    do forever
  266.       o = line.0 + 1
  267.  
  268.       line.o = GetResponseLine(sock)
  269.       say line.o 
  270.  
  271.       if (line.o = ".")|(line.o = "") then
  272.          return ""
  273.  
  274.       line.0 = o
  275.    end
  276.  
  277.    return ""
  278.  
  279. /*------------------------------------------------------------------
  280.  * get a line from the server
  281.  *------------------------------------------------------------------*/
  282. GetResponseLine: procedure expose !. logfile cenum smtpsock
  283.    sock = arg(1)
  284.  
  285.    crlf = d2c(13) || d2c(10)
  286.  
  287.    if (symbol('!.buff') = "LIT") then
  288.       !.buff = ""
  289.  
  290.    nullcount=0
  291.    do while (pos(crlf,!.buff) = 0)
  292.       semname='\SEM32\sem'||cenum     
  293.       call SemEventCreate 'sem.cenum', semname      
  294.       call SemStartTimer 'timer.cenum', 1000000, sem.cenum
  295.       call ipccontextcreate contextsr.cenum
  296.       call proccreatethread contextsr.cenum,'sockrcv.cmd', sock, queue.cenum, sem.cenum
  297.  
  298.       call SemEventWait sem.cenum,15000 /* timeout time is 15 sec for receiving 512 bytes */
  299.       if result=640 then 
  300.         do
  301.          call saynlog 'Timeout receiving data from socket 'sock'. Closing forwarding.'
  302.          call IpcContextClose contextsr.cenum
  303.          call SemStopTimer timer.cenum
  304.          call SemEventClose sem.cenum
  305.          if smtpsock\=sock then smtpsock=closesmtp(smtpsock)
  306.          rc=SockSoclose(sock)
  307.          exit 
  308.         end
  309.       call IpcContextResult contextsr.cenum
  310.       count=left(result,5)
  311.       data=delstr(result,1,5)
  312.       if count=0 then 
  313.        do
  314.         call saynlog 'Null characters received '||count||'  '||nullcount||' *'||data||'*'
  315.         nullcount=nullcount+1
  316.        end
  317.       if nullcount>10 then 
  318.        do
  319.          Call saynlog 'Server closed connection on receive'
  320.          if smtpsock\=sock then smtpsock=closesmtp(smtpsock)
  321.          rc=SockSoclose(sock)
  322.          exit
  323.        end
  324.       call SemStopTimer timer.cenum
  325.       call SemEventClose sem.cenum
  326.       !.buff = !.buff || data
  327.    end
  328.  
  329.    p = pos(crlf,!.buff)
  330.    line = substr(!.buff,1,p-1)
  331.    !.buff = substr(!.buff,p+2)
  332.  
  333.    if left(line,4)='-ERR' then call saynlog 'Pop3server says:'line
  334.    return line
  335.  
  336. /*------------------------------------------------------------------
  337.  * send a string to the server
  338.  *------------------------------------------------------------------*/
  339. SendMessage:     procedure expose !. smtpsock logfile cenum
  340.    sock = arg(1)
  341.    data = arg(2) || d2c(13) || d2c(10)
  342.  
  343.    /* say 'Sending "'data'" to server.' */
  344.    len = length(data)
  345.    do while (len > 0)
  346.      
  347.       len = SockSend(sock,data);
  348.  
  349.       /* say 'Returncode: ' len   */
  350.       /* say 'Errorcode:  ' errno */
  351.       /*
  352.       if (errno <> 0) then
  353.          Error(-1,"Error sending data to server.")
  354.       */
  355.  
  356.       if (len <= 0) then
  357.        do
  358.          call saynlog "Server closed the connection."
  359.          if smtpsock\=sock then smtpsock=closesmtp(smtpsock)
  360.          rc=SockSoclose(sock)
  361.          exit
  362.        end
  363.       
  364.       data = substr(data,len+1)
  365.       len  = length(data)
  366.    end
  367.  
  368.    return 0
  369.  
  370. /*-----------------------------*/
  371. closesmtp: procedure expose !. logfile cenum
  372. smtpsock=arg(1)
  373.  
  374. if smtpsock>0 then
  375.  do
  376.   trc = SockSend(smtpsock,'QUIT') 
  377.   rc = SockSoclose(smtpsock)
  378.  end 
  379.  
  380. return -1
  381.  
  382. /*-----------------------------*/
  383. saynlog: procedure expose logfile cenum
  384.  mes='Thread '||cenum||':'||arg(1)
  385.  say mes
  386.  call lineout logfile , mes
  387. return
  388.